package cn.structure.linear.stack;

import java.util.Arrays;

/**
 * 栈数据结构
 * 特点：先入先出
 *
 * @author dunlingiz
 * @date 2024/2/20
 * @since v
 */
public class MyStack {

    /**
     * 数组保存元素
     */
    transient int[] stackArray;

    /**
     * 栈顶指针
     */
    private int top;

    public MyStack(int capacity) {
        // todo 必要性校验
        stackArray = new int[capacity];
        top = -1;
    }

    /**
     * 入栈操作
     *
     * @param value 入栈元素
     */
    public void push(int value) {
        if (top == stackArray.length - 1) {
            throw new IllegalStateException("MyStack is full");
        }
        stackArray[++top] = value;
    }

    public int pop() {
        if (isEmpty()) {
            throw new IllegalStateException("MyStack is empty");
        }
        // 获取栈顶元素
        int popNum = stackArray[top];
        //将移出的位置数组元素初始化
        stackArray[top] = 0;
        // 上述操作并不影响最终结果，只是打印栈中元素比较合理
        //移动栈顶
        top--;
        return popNum;
        // return stackArray[top--]
    }

    /**
     * 获取栈顶元素
     *
     * @return 栈顶数据
     */
    public int peek() {
        if (isEmpty()) {
            throw new IllegalStateException("MyStack is empty");
        }
        return stackArray[top];
    }

    /**
     * 判断栈是否为空
     *
     * @return 栈是否为空
     */
    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * 获取栈的大小
     */
    public int getSize() {
        return top + 1;
    }

    public void output() {
        System.out.println(Arrays.toString(stackArray));
    }
}
